﻿#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <Windows.h>
#include <WS2tcpip.h>

int main()
{
	//1.确定协议版本
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		printf("请求的协议版本不是2.2版本!\n");
		//9.清理协议信息
		WSACleanup();
		return -1;
	}

	//2.创建socket
	SOCKET sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (SOCKET_ERROR == sSocket)
	{
		printf("创建socket失败:%d\n", GetLastError());
		return -2;
	}
	printf("创建socket成功\n");

	//3.确定服务器的协议地址簇
	SOCKADDR_IN addr = { 0 };
	addr.sin_family = AF_INET;//和socket函数第一个参数保持一致
	//addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//本地ip地址
	inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr.S_un.S_addr);//vs2013版本以上使用新的函数转换IP地址
	addr.sin_port = htons(10086);//大小端转换

	//4.绑定
	int r = bind(sSocket, (sockaddr*)&addr, sizeof addr);
	if (-1 == r)
	{
		printf("绑定失败:%d\n", GetLastError());

		//8. 断开连接
		closesocket(sSocket);

		//9. 清理协议版本信息
		WSACleanup();

	}
	printf("绑定成功\n");

	//5. 监听
	r = listen(sSocket, 10);
	if (-1 == r)
	{
		printf("监听失败:%d\n", GetLastError());

		//8. 断开连接
		closesocket(sSocket);

		//9. 清理协议版本信息
		WSACleanup();
		return -2;
	}
	printf("监听成功\n");

	//6. 等待客户端连接
	SOCKET cSocket = accept(sSocket, NULL, NULL);//服务器在接受客户端连接的时候
	if (SOCKET_ERROR == cSocket)
	{
		printf("服务器崩溃:%d\n", GetLastError());

		//8. 断开连接
		closesocket(sSocket);
		//9. 清理协议版本信息
		WSACleanup();
		return -3;
	}
	printf("有客户端连接上服务器了!\n");

	//7. 通信
	char buff[256] = { 0 };

	while (1)
	{
		//接收信息
		r = recv(cSocket, buff, 255, NULL);//从客户端接收信息
		//判断是否接收到信息
		if (r > 0)
		{
			buff[r] = 0;//添加结束符号
			printf(">>%s\n", buff);//输出
		}
	}

	while (1);//停顿
	return 0;
}